import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

# 采样率
fs = 10000
# 信号时长
t = np.arange(0, 1, 1/fs)


# 生成实信号
# 幅度为1，频率为50Hz的信号
signal_50Hz = 1 * np.sin(2 * np.pi * 50 * t)
# 幅度为0.125，频率为250Hz的反向旋转信号
signal_250Hz = 0.125 * np.sin(-2 * np.pi * 250 * t)
# 合成信号
signal = signal_50Hz + signal_250Hz
N = len(signal)

ori_frequencies = np.fft.fftfreq(N, 1/fs)
ori_spectrum = 2/N*np.fft.fft(signal)   #这里的何时比例是2/N


# 希尔伯特变换
analytic_signal = hilbert(signal)
#signal1 = 1 * (np.sin(2 * np.pi * 50 * t) + 1j*np.cos(2*np.pi*50*t))
#signal2 = 0.125 * (np.sin(-2 * np.pi * 250 * t) + 1j*np.cos(-2*np.pi*250*t))
#analytic_signal  = signal1 + signal2
# 计算频谱
frequencies = np.fft.fftfreq(N, 1/fs)
spectrum = 1/(N)*np.fft.fft(analytic_signal)  #所以，这里的合适缩放比例应该是1/N

# 绘制频谱图
# 创建一个包含2行1列子图的figure
fig, axes = plt.subplots(2, 1, figsize=(12, 10))

# 绘制原始实信号的频谱图
axes[0].plot(ori_frequencies, np.abs(ori_spectrum))
axes[0].set_title('Spectrum of raw realtime - signal')
axes[0].set_xlabel('Frequency (Hz)')
axes[0].set_ylabel('Magnitude post_fft_ratio:2/N, N=count of(sample array)')
axes[0].grid(True)

# 绘制希尔伯特变换后信号的频谱图
axes[1].plot(frequencies, np.abs(spectrum))
axes[1].set_title('Spectrum of the Hilbert - transformed signal')
axes[1].set_xlabel('Frequency (Hz)')
axes[1].set_ylabel(f'Magnitude post_fft_ratio:1/N, N=count of(sample array)')
axes[1].grid(True)

# 自动调整子图布局
plt.tight_layout()
plt.show()